package com.zenithmind.document.pojo.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.*;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 文档分享创建DTO
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "文档分享创建DTO")
public class DocumentShareCreateDTO {

    /**
     * 文档ID
     */
    @Schema(description = "文档ID")
    @NotBlank(message = "文档ID不能为空")
    private String documentId;

    /**
     * 分享标题
     */
    @Schema(description = "分享标题")
    @Size(max = 200, message = "分享标题长度不能超过200字符")
    private String shareTitle;

    /**
     * 分享描述
     */
    @Schema(description = "分享描述")
    private String shareDescription;

    /**
     * 分享类型（1-公开链接，2-密码链接，3-指定用户，4-指定群组）
     */
    @Schema(description = "分享类型（1-公开链接，2-密码链接，3-指定用户，4-指定群组）")
    @NotNull(message = "分享类型不能为空")
    @Min(value = 1, message = "分享类型值不能小于1")
    @Max(value = 4, message = "分享类型值不能大于4")
    private Integer shareType;

    /**
     * 分享密码
     */
    @Schema(description = "分享密码")
    @Size(max = 20, message = "分享密码长度不能超过20字符")
    private String sharePassword;

    /**
     * 权限类型（1-只读，2-下载，3-编辑，4-管理）
     */
    @Schema(description = "权限类型（1-只读，2-下载，3-编辑，4-管理）")
    @NotNull(message = "权限类型不能为空")
    @Min(value = 1, message = "权限类型值不能小于1")
    @Max(value = 4, message = "权限类型值不能大于4")
    private Integer permissionType;

    /**
     * 过期时间
     */
    @Schema(description = "过期时间")
    private LocalDateTime expireTime;

    /**
     * 最大访问次数
     */
    @Schema(description = "最大访问次数")
    @Min(value = 0, message = "最大访问次数不能为负数")
    private Integer maxAccessCount;

    /**
     * 最大下载次数
     */
    @Schema(description = "最大下载次数")
    @Min(value = 0, message = "最大下载次数不能为负数")
    private Integer maxDownloadCount;

    /**
     * 是否允许转发（0-否，1-是）
     */
    @Schema(description = "是否允许转发（0-否，1-是）")
    @Min(value = 0, message = "是否允许转发值只能是0或1")
    @Max(value = 1, message = "是否允许转发值只能是0或1")
    private Integer allowForward = 1;

    /**
     * 是否需要登录（0-否，1-是）
     */
    @Schema(description = "是否需要登录（0-否，1-是）")
    @Min(value = 0, message = "是否需要登录值只能是0或1")
    @Max(value = 1, message = "是否需要登录值只能是0或1")
    private Integer requireLogin = 0;

    /**
     * 是否水印保护（0-否，1-是）
     */
    @Schema(description = "是否水印保护（0-否，1-是）")
    @Min(value = 0, message = "是否水印保护值只能是0或1")
    @Max(value = 1, message = "是否水印保护值只能是0或1")
    private Integer watermarkProtection = 0;

    /**
     * 分享给用户ID列表（分享类型为指定用户时使用）
     */
    @Schema(description = "分享给用户ID列表")
    private List<String> shareUserIds;

    /**
     * 分享给群组ID列表（分享类型为指定群组时使用）
     */
    @Schema(description = "分享给群组ID列表")
    private List<String> shareGroupIds;

    /**
     * 通知方式（1-站内信，2-邮件，3-短信，4-微信）
     */
    @Schema(description = "通知方式")
    private List<Integer> notificationTypes;

    /**
     * 自定义消息
     */
    @Schema(description = "自定义消息")
    private String customMessage;

    /**
     * 标签（JSON格式）
     */
    @Schema(description = "标签（JSON格式）")
    private String tags;

    /**
     * 备注
     */
    @Schema(description = "备注")
    private String remarks;

    /**
     * 创建者ID
     */
    @Schema(description = "创建者ID")
    private String creatorId;

    /**
     * 创建者名称
     */
    @Schema(description = "创建者名称")
    private String creatorName;

    /**
     * 获取标题（兼容性方法）
     */
    public String getTitle() {
        return shareTitle;
    }

    /**
     * 设置标题（兼容性方法）
     */
    public void setTitle(String title) {
        this.shareTitle = title;
    }

    /**
     * 获取访问密码（兼容性方法）
     */
    public String getAccessPassword() {
        return sharePassword;
    }

    /**
     * 设置访问密码（兼容性方法）
     */
    public void setAccessPassword(String accessPassword) {
        this.sharePassword = accessPassword;
    }

    /**
     * 获取描述（兼容性方法）
     */
    public String getDescription() {
        return shareDescription;
    }

    /**
     * 设置描述（兼容性方法）
     */
    public void setDescription(String description) {
        this.shareDescription = description;
    }

    /**
     * 获取权限（兼容性方法）
     */
    public Integer getPermission() {
        return permissionType;
    }

    /**
     * 设置权限（兼容性方法）
     */
    public void setPermission(Integer permission) {
        this.permissionType = permission;
    }
}
